/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.datamodel.LazyLogradouro;
import br.jm.financeiro.entity.CepBairro;
import br.jm.financeiro.entity.CepCidade;
import br.jm.financeiro.entity.CepEndereco;
import br.jm.financeiro.entity.CepUf;
import br.jm.financeiro.sistema.eao.EnderecoEao;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author joao
 */
public class EnderecoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private CepEndereco selectedEndereco = new CepEndereco();
    private CepBairro selectedBairro = new CepBairro();
    private final EnderecoEao enderecoEAO;
    private LazyDataModel<CepEndereco> lazyModelEndereco;
    private String numeroCep;
    private String descLogradouro;
    private String descBairro;
    private String descCidade;
    private String descUf;
    private final Map<String, Object> pesquisas = new HashMap<>();
    private final FacesContext ctx;
    private final HttpSession session;

    public EnderecoBean() {
        selectedBairro = new CepBairro();
        selectedEndereco = new CepEndereco();
        enderecoEAO = EnderecoEao.getInstance();
        ctx = FacesContext.getCurrentInstance();
        session = (HttpSession) ctx.getExternalContext().getSession(false);
        session.setAttribute("pesquisa", pesquisas);

        lazyModelEndereco = new LazyLogradouro(enderecoEAO);
    }

    public LazyDataModel<CepEndereco> getLazyModelEndereco() {
        return lazyModelEndereco;
    }

    public void setLazyModelEndereco(LazyDataModel<CepEndereco> lazyModelEndereco) {
        this.lazyModelEndereco = lazyModelEndereco;
    }

    public CepEndereco getSelectedEndereco() {
        if (selectedEndereco == null) {
            selectedEndereco = new CepEndereco();
        }
        return selectedEndereco;
    }

    public void setSelectedEndereco(CepEndereco selectedEndereco) {
        this.selectedEndereco = selectedEndereco;
    }

    public void inserir(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            selectedEndereco.setCodLogradouro(null);
            selectedEndereco.setNumCep(selectedEndereco.getNumCep().replace("-", ""));
            enderecoEAO.create(selectedEndereco);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Endereco Inserido com Sucesso: ".concat(selectedEndereco.getDscLogradouro())),selectedEndereco.getDscLogradouro());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Inserir: " + selectedEndereco.getDscLogradouro(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            selectedEndereco.setNumCep(selectedEndereco.getNumCep().replace("-", ""));
            enderecoEAO.edit(selectedEndereco);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Endereco Alterado com Sucesso: ".concat(selectedEndereco.getDscLogradouro())),selectedEndereco.getDscLogradouro());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Alterar: " + selectedEndereco.getDscLogradouro(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) {
        FacesMessage msg = null;

        try {
            enderecoEAO.destroy(selectedEndereco);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Endereco Excluido com Sucesso: ".concat(selectedEndereco.getDscLogradouro())),selectedEndereco.getDscLogradouro());
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Excluir: " + selectedEndereco.getDscLogradouro(),
                    e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void preparaInserir(ActionEvent actionEvent) {
        try {
            CepUf cepUf = new CepUf();
            CepCidade cepCidade = new CepCidade();
            cepCidade.setCodUf(cepUf);
            CepBairro bairro = new CepBairro();
            bairro.setCodCidade(cepCidade);
            selectedEndereco = new CepEndereco();
            selectedEndereco.setCodBairro(bairro);
        } catch (Exception ex) {
            //Logger.getLogger(EnderecoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void PesquisarEndereco(ActionEvent actionEvent) {
        pesquisas.clear();

        if (numeroCep != null) {
            if (!numeroCep.isEmpty()) {
                this.numeroCep = this.numeroCep.replace("-", "");
                pesquisas.put("numCep", numeroCep);
            }
        }

        if (descLogradouro != null) {
            if (!descLogradouro.isEmpty()) {
                pesquisas.put("dscLogradouro", descLogradouro);
            }
        }

        if (descBairro != null) {
            if (!descBairro.isEmpty()) {
                pesquisas.put("codBairro.dscBairro", descBairro);
            }
        }

        if (descCidade != null) {
            if (!descCidade.isEmpty()) {
                pesquisas.put("codBairro.codCidade.dscCidade", descCidade);
            }
        }

        if (descUf != null) {
            if (!descUf.isEmpty()) {
                pesquisas.put("codBairro.codCidade.codUf.codUf", descUf);
            }
        }
        SortOrder sortOrder = null;
        session.setAttribute("pesquisa", pesquisas);
        //    lazyModelEndereco.load(0, 20, "numCep", sortOrder, pesquisas);
    }

    public String getNumeroCep() {
        return numeroCep;
    }

    public void setNumeroCep(String numeroCep) {
        this.numeroCep = numeroCep;
    }

    public String getDescBairro() {
        return descBairro;
    }

    public void setDescBairro(String descBairro) {
        this.descBairro = descBairro;
    }

    public String getDescCidade() {
        return descCidade;
    }

    public void setDescCidade(String descCidade) {
        this.descCidade = descCidade;
    }

    public String getDescLogradouro() {
        return descLogradouro;
    }

    public void setDescLogradouro(String descLogradouro) {
        this.descLogradouro = descLogradouro;
    }

    public String getDescUf() {
        return descUf;
    }

    public void setDescUf(String descUf) {
        this.descUf = descUf;
    }

    public CepBairro getSelectedBairro() {
        return selectedBairro;
    }

    public void setSelectedBairro(CepBairro selectedBairro) {
        this.selectedEndereco.setCodBairro(selectedBairro);
        this.selectedBairro = selectedBairro;
    }
}
